package com.cskaoyan.javase.oop3._3lambda._2notice;

/**
 * 注意事项:
 *
 * 1.Lambda表达式是特殊的局部内部类
 * 所以它访问方法/作用域内部的局部变量，该变量必须是final的（实际常量）。
 *
 * 2.除此之外
 * 局部内部类，匿名内部类它们都有自己独立的作用域，能够自定义自己的成员。
 * 但是Lambda表达式的"{}"没有自身独立的作用域，不能自定义成员，和方法共用同一个作用域。
 *
 * 3.方法引用的语法所指向的已实现方法,除了可以是我们自定义的方法
 *      还可以是JDK源码中方法,三方工具类库中的方法等
 *      总之,只要是一个可以访问到的方法,满足语法都可以使用
 *
 * @since 10:05
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int num = 10;
        new IA() {
            @Override
            public void test(int a) {
                int num = 10;
            }
        };
        IA ia = a -> {
            System.out.println(num);
            // num++;
            // Variable 'num' is already defined in the scope
            // int num = 10;
        };
        System.out.println("---------------------------");

        IB ib = System.out::println;
        ib.test("66666666!");
        IB ib2 = str -> System.out.println(str);
        ib2.test("77777777777777!");
    }
}

@FunctionalInterface
interface IB {
    void test(String str);
}

@FunctionalInterface
interface IA {
    void test(int a);
}